import tkinter as tk
from tkinter import ttk
import pandas as pd
from typing import Optional


class DealDetails:
    """成交明细组件：展示最新成交记录，区分涨跌颜色"""

    COLUMNS = ("时间", "价格", "成交量")  # 表格列名

    def __init__(self, parent_frame: ttk.Frame):
        # 创建主容器
        self.frame = ttk.LabelFrame(parent_frame, text="最新成交")
        self.frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)

        # 创建表格控件
        self._setup_treeview()
        # 创建滚动条
        self._setup_scrollbar()
        # 配置涨跌颜色标签
        self._setup_tags()

    def _setup_treeview(self):
        """初始化成交明细表格"""
        self.tree = ttk.Treeview(
            self.frame,
            columns=self.COLUMNS,
            show="headings",  # 只显示列标题，不显示首列
            height=8,  # 显示8行数据
            selectmode='none'  # 禁止选择行
        )

        # 设置列标题和宽度
        for col in self.COLUMNS:
            self.tree.heading(col, text=col)

        # 单独设置每列宽度和对齐方式
        self.tree.column(self.COLUMNS[0], width=120, anchor=tk.CENTER)  # 时间列
        self.tree.column(self.COLUMNS[1], width=100, anchor=tk.CENTER)  # 价格列
        self.tree.column(self.COLUMNS[2], width=120, anchor=tk.CENTER)  # 成交量列

        # 布局表格
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)

    def _setup_scrollbar(self):
        """为表格添加垂直滚动条"""
        scrollbar = ttk.Scrollbar(
            self.frame,
            orient=tk.VERTICAL,
            command=self.tree.yview  # 绑定表格的Y轴滚动
        )
        self.tree.configure(yscroll=scrollbar.set)  # 双向绑定
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)  # 布局滚动条

    def _setup_tags(self):
        """配置涨跌颜色标签（涨红跌绿）"""
        self.tree.tag_configure('up', foreground='red')  # 上涨标签（红色）
        self.tree.tag_configure('down', foreground='green')  # 下跌标签（绿色）

    def update_deals(self, deals: Optional[pd.DataFrame], last_close: float):
        """更新成交明细数据

        Args:
            deals: 成交数据DataFrame，需包含'time'、'price'、'volume'列
            last_close: 昨收价，用于判断涨跌
        """
        # 清空现有数据
        self.tree.delete(*self.tree.get_children())

        # 数据为空时不更新
        if deals is None or deals.empty:
            return

        # 只显示最新的10条数据
        for _, row in deals.head(10).iterrows():
            # 格式化时间（如"103000" -> "10:30:00"）
            time_str = self._format_time(str(row['time']))
            # 转换价格和成交量格式
            price = float(row['price'])
            volume = int(row['volume'])

            # 根据价格与昨收价比较设置标签（涨红跌绿）
            tag = 'up' if price >= last_close else 'down'

            # 插入行数据
            self.tree.insert(
                '',  # 插入到根节点
                tk.END,  # 插入到末尾
                values=(
                    time_str,
                    f"{price:.2f}",  # 价格保留2位小数
                    f"{volume:,}"  # 成交量添加千位分隔符
                ),
                tags=(tag,)  # 应用涨跌标签
            )

    @staticmethod
    def _format_time(time_str: str) -> str:
        """格式化时间字符串（6位数字 -> 时分秒）

        Args:
            time_str: 时间字符串，如"093000"表示9点30分00秒

        Returns:
            格式化后的时间字符串，如"09:30:00"
        """
        if len(time_str) == 6 and time_str.isdigit():
            return f"{time_str[:2]}:{time_str[2:4]}:{time_str[4:]}"
        return time_str  # 不符合格式则返回原始字符串